#!/bin/bash
# parameter 1: sql file
# parameter 2: host
# parameter 3: port
# parameter 4: password
# parameter 5: db
# parameter 6: online ddl tool, pt or gh-ost

set -eu

sql_file=$1
host=$2
port=$3
password=$4
schema=$5
ghost_bin=${GHOST_BINARY:-gh-ost}
ptosc_bin=${PTOSC_BINARY:-pt-online-schema-change}

echo "[$(date)] Executing SQL: $sql_file" > "$TEST_DIR/sql_res.$TEST_NAME.txt"

# we use lower case `alter table` in test sql, if want case insensetive,
# just set `shopt -s nocasematch`
ddl_regex="^alter table.*"
while IFS= read -r line
do
    if [[ "$line" =~ $ddl_regex ]]; then
        table=$(echo $line | cut -d " " -f3)
        alter=$(echo $line | cut -d " " -f4-)
        # gh-ost check connection port whether equals to `select @@global.port`.
        # if we have test MySQL in container and port mapping, these two ports
        # may different. So we cheat gh-ost that we are running on aliyun rds,
        # on which will disable the port check.
        if [ "$6" == "gh-ost" ]; then
            $ghost_bin --user=root --host=$host --port=$port --password=$password \
                --database=$schema --table=$table --alter="$alter" \
                --serve-socket-file="$TEST_DIR/gh-ost.$schema.$table.$port.sock" \
                --allow-on-master --allow-master-master --initially-drop-ghost-table \
                --initially-drop-old-table -ok-to-drop-table -aliyun-rds -execute \
                >> $TEST_DIR/gh-ost.log
        elif [ "$6" == "pt" ]; then
            $ptosc_bin --user=root --host=$host --port=$port --password=$password \
                --alter="$alter" D=$schema,t=$table \
                 --recursion-method=none --print --execute \
                 >> $TEST_DIR/pt-osc.log
        else
            mysql -uroot -h$host -P$port -p$password --default-character-set utf8 -E -e "use $schema; $line" >> "$TEST_DIR/sql_res.$TEST_NAME.txt"
        fi
    else
        mysql -uroot -h$host -P$port -p$password --default-character-set utf8 -E -e "use $schema; $line" >> "$TEST_DIR/sql_res.$TEST_NAME.txt"
    fi
done <"$sql_file"
